package net.cjw.initsb.controller.test;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import springfox.documentation.annotations.ApiIgnore;
import net.cjw.initsb.config.asynctask.AsyncTask;

@ApiIgnore
@RestController
public class AsyncTestController {

	@Autowired
	private AsyncTask asyncTask;

	// 没有返回值的异步任务
	@GetMapping("async1")
	public String test2() {
		System.out.println("访问开始");
		asyncTask.task1();
		asyncTask.task2();
		asyncTask.task3();
		System.out.println("访问结束");
		// 访问开始
		// task1()开始执行
		// 访问结束
		// task2()开始执行
		// task3()开始执行
		// task2()执行完成
		// task1()执行完成
		// task3()执行完成

		return "访问成功";
	}

	// 有返回值的异步任务
	@GetMapping("async2")
	public String test3() throws InterruptedException, ExecutionException {
		System.out.println("访问开始");
		Future<String> future4 = asyncTask.task4();
		Future<String> future5 = asyncTask.task5();
		System.out.println("访问结束");

		boolean future4Finish = false;
		boolean future5Finish = false;

		while (true) {
			if (future4.isCancelled()) {
				future4Finish = true;
				System.out.println("任务4取消执行");
			}
			if (future4.isDone()) {
				future4Finish = true;
				System.out.println("任务4执行完成 结果: " + future4.get());

			}
			if (future5.isCancelled()) {
				future5Finish = true;
				System.out.println("任务5取消执行");
			}
			if (future5.isDone()) {
				future5Finish = true;
				System.out.println("任务5执行完成 结果: " + future5.get());

			}
			if (future4Finish && future5Finish) {
				System.out.println("返回结果获取完成,退出循环");
				break;
			}
			Thread.sleep(200);
		}
		// 访问开始
		// 2017-10-12 18:48:28.579 INFO 23228 --- [nio-9091-exec-9]
		// .s.a.AnnotationAsyncExecutionInterceptor : No task executor bean
		// found for async processing: no bean of type TaskExecutor and no bean
		// named 'taskExecutor' either
		// 访问结束
		// task5()开始执行
		// task4()开始执行
		// task5()执行完成
		// task4()执行完成
		// 任务4执行完成 结果: task4()返回值
		// 任务5执行完成 结果: task5()返回值
		// 返回结果获取完成,退出循环

		return "访问成功";
	}
}
